package cn.itmantzy.basic.service.impl;

import cn.itmantzy.basic.constant.BaseConstants;
import cn.itmantzy.basic.exception.BusinessException;
import cn.itmantzy.basic.service.IVerifyCodeService;
import cn.itmantzy.basic.util.StrUtils;
import cn.itmantzy.user.domain.User;
import cn.itmantzy.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private IUserService userService;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void sendSmsCode(Map<String, String> params) {
        // 1.首先通过前端传递的参数获取到手机号并校验手机号不能为空
        String phone = params.get("phone");
        if (StringUtils.isEmpty(phone)) {
            throw new BusinessException("请注意，手机号不能为空！！！");
        }
        // 2.通过电话号码查询t_user表，判断该手机号是否被注册过
        User user = userService.queryByPhone(phone);
        // 快捷键user.nn 判断不为空
        if (user != null) {
            throw new BusinessException("对不起，该手机号已被注册，请点击找回密码进行找回!!!");
        }
        // 3.获取验证码，判断验证码是否已过期
        String key = BaseConstants.BUSINESS_REGISTER_PREFIX + phone;
        Object codeValueTemp = redisTemplate.opsForValue().get(key); // 获取验证码，判断验证码是否过期
        String code = "";
        if (codeValueTemp != null) { // 证明已经获取了验证码，并且没有过期
            // 获取到原来的初始时间
            Long oldTime = Long.valueOf(((String) codeValueTemp).split(":")[1]);
            if (System.currentTimeMillis() - oldTime <= 1 * 60 * 1000) {
                // 如果间隔时间小于一分钟证明，是有人在进行恶意攻击，或者恶作剧,抛出警告
                throw new BusinessException("你**********的，跟我等着");
            }
            // 就满足大于1分钟小于3分钟，这时应该获取原来的验证码，并刷新过期时间
            code = ((String) codeValueTemp).split(":")[0];
        } else { // 第一次获取验证码或者已经获取了验证码但是过期了，就获取一个新的验证码
            code = StrUtils.getComplexRandomString(4); // 获取一个长度为4的验证码
        }
        // 获取到验证码过后，应该获取到时间初
        String codeValue = code + ":" + System.currentTimeMillis();
        // 保存验证码到redis，设置过期时间为3分钟，即可
        redisTemplate.opsForValue().set(key, codeValue, 3, TimeUnit.MINUTES);
        // 调用发送短信验证码方法，发送短信
        // SmsUtils.sendSms("13035602183", "尊敬的用户您好，您的验证码为：" + code + "请在3分钟内完成验证！！！");
        System.out.println("尊敬的用户您好，您的验证码为：" + code + "请在3分钟内完成验证！！！");
    }
}
